# def my_log(string, n=1, info="困不困"):
#     """
#     打印指定字符串 指定次数
#     :param string:  要打印的字符串
#     :param n:  打印的次数  n具有默认值10
#     :param info:  额外信息
#     """
#     print("开始执行函数")
#     for i in range(n):
#         print(string)
#     print("执行函数结束")
#     print(f"{info}?")
#
#
# my_log("hello", 2)
# my_log("hi")
# my_log("醒醒啦", info="饿不饿")
import random

# print(max(10, 20, 5, 15, -50, 150, -500))


# def my_log(string, *args, info="困不困", **kwargs, ):
#     print(string)
#     print(args, type(args))
#     for e in args:
#         print(e)
#
#     print(f"{info}?")
#
#     print(kwargs, type(kwargs))
#
#
# my_log(10, 20, 30, 40, 50, 100, key1="雅迪电动车", info="饿不饿",  key2="小米汽车", key3="楼下新开一个超时")

# f = open("abc.txt", "w")
# print(1, 2, 3, 4, 5, sep="+", end="=", file=f)
# f.close()

# value = random.randint(10, 20)
# def max_age(item):
#     return item["age"]
#
#
# print(max([{"name": "a", "age": 10}, {"name": "c", "age": 5}, {"name": "b", "age": 20}], key=max_age))


# a 的作用域 声明以后得区域
# a = 10
# print(a)

# value = int(input("输入数字"))
# if value > 10:
#     a = 10
#     print(a)
# print(a)

# for i in range(10):
#     # a 是定义在循环内部的变量  出了循环最好不要使用
#     a = 10 + i
# print(i, a)


# def fun1():
#     # a是定义在函数内部的变量， 出了函数 作用域失效
#     a = 10
# fun1()
# print(a)


# c = 100
# def fun2(a):
#     """
#     形参a 与变量b 都是函数内部定义的变量
#     作用域都在函数内部
#     函数内部可以获取 函数外部变量c  获取值是100
#     函数内部修改函数外部变量 需要使用关键字global
#     """
#     b = 20
#     # 在函数内部从新定义局部变量c 作用域函数内部  和外部变量c不干扰
#     # c = 200
#     # print(a, b, c)
#
#     # 这种写法有错误  在声明局部变量c 前使用了c
#     # print(a, b, c)
#     # c = 200
#
#     # 函数内部如果要修改外部变量c 需要通过关键字global来修改
#     global c
#     c = 300
#     print(c)
#
# fun2(10)
# print(c)


# a = 10
# b = 2
# def fun1():
#     b = 20
#     # 使用全局变量a(不在任一个函数内部)
#     global a
#     a = 100
#     print(a, b)
#     def fun2():
#         c = 30
#         # 使用fun1中定义的变量b=20
#         nonlocal b
#         # 使用98 行定义全局变量b = 2
#         # global b
#         b = 200
#         print(b, c)
#     fun2()
#     print(a, b)
# fun1()
# print(b)


# a = 10
# l = []
# d0 = {}
#
# def fun1():
#     global a
#     a = 20
#     print(a)
#
#     l.append(10)
#     print(l)
#
#     d0["name"] = "qiku"
#     print(d0)
#
# fun1()
# print(a)
# print(l)
# print(d0)


# 等号赋值 直接拷贝地址  修改一个另一个也会修改
# l = [10]
# l2 = l
# # 地址一样
# print(id(l), id(l2))
# l.append(20)
# print(l2)


# l = [10, ["A", "B"]]
# # 浅拷贝， 得到新列表  修改一个，另一个不修改
# # 如果元素是不可变类型 直接拷贝值
# # 如果元素是可变类型 直接拷贝地址 修改一个，另一个也会变化
# l2 = l.copy()
# print(id(l), id(l2), id(l[1]), id(l2[1]))
# l.append(20)
# print(l2)
# l[1].append("C")
# print(l2)


# 深拷贝   直接使用原始数据 构造一个新的数据，两者不在发生关联 ，完全独立
# import copy
# l = [10, ["A", "B"]]
# l2 = copy.deepcopy(l)
#
# l.append(10)
# print(l2)
# l[1].append("C")
# print(l2)


# d = {"name": "qiku", "age": 10}
# d2 = d
# d["age"] = 20
# print(d2)

# d = {"name": "qiku", "age": 10, "addr": ["郑州"]}
# d2 = d.copy()
# d["age"] = 20
# print(d2)
# d["addr"].append("开封")
# print(d2)

import copy
d = {"name": "qiku", "age": 10, "addr": ["郑州"]}
d2 = copy.deepcopy(d)
d["age"] = 20
print(d2)
d["addr"].append("开封")
print(d2)